home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / CMPMM2.M < prev    next >
Encoding:
Text File  |  1990-05-16  |  4.3 KB  |  177 lines

  1. MODULE CmpMM2;
  2.  
  3. IMPORT TOSIO; (*$E MOS *)
  4.  
  5. FROM InOut IMPORT Write, WriteLn, WriteString, WriteInt, Read, ReadString;
  6.  
  7. IMPORT Paths, ShellMsg;
  8.  
  9. FROM Files IMPORT File, Access, Open, Close, State;
  10.  
  11. FROM Binary IMPORT FileSize, ReadBytes;
  12.  
  13. FROM Directory IMPORT MakeFullPath, ValidatePath, DirQuery, DirEntry,
  14.         QueryFiles, QueryAll, subdirAttr, FileAttrSet;
  15.  
  16. FROM Strings IMPORT String, Empty, Append, Assign, Length, Space, Upper, Concat;
  17.  
  18. FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD, ASSEMBLER;
  19.  
  20. VAR subdirs, ok: BOOLEAN;
  21.     res: INTEGER;
  22.     f1, f2: File;
  23.     buf1, buf2: ARRAY [1..$8000] OF CARDINAL;
  24.     line: CARDINAL;
  25.  
  26.  
  27. PROCEDURE equal (a,b: ADDRESS; n: LONGCARD): BOOLEAN;
  28.   VAR r: BOOLEAN;
  29.   BEGIN
  30.     ASSEMBLER
  31.         MOVE.L  a(A6),A0
  32.         MOVE.L  b(A6),A1
  33.         MOVE.L  n(A6),D0
  34.         MOVEQ   #0,D1
  35.         BRA     l
  36.      l2 SWAP    D0
  37.      l1 CMPM.B  (A0)+,(A1)+
  38.      l  DBNE    D0,l1
  39.         BNE     f
  40.         SWAP    D0
  41.         DBRA    D0,l2
  42.         MOVE.B  -1(A0),D0
  43.         CMP.B   -1(A1),D0
  44.      f  SEQ     D0
  45.         ANDI    #1,D0
  46.         MOVE    D0,r(A6)
  47.     END;
  48.     RETURN r
  49.   END equal;
  50.  
  51. PROCEDURE error (s, m: ARRAY OF CHAR);
  52.   VAR ch: CHAR;
  53.   BEGIN
  54.     WriteLn;
  55.     WriteString (s);
  56.     WriteString (Space (60-INTEGER(Length(s))));
  57.     Write (' ');
  58.     WriteString (m);
  59.     INC (line);
  60.     IF line > 20 THEN
  61.       Read (ch);
  62.       line:= 1
  63.     END;
  64.   END error;
  65.  
  66. PROCEDURE checkFile (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  67.  
  68.   VAR source, dest: String;
  69.       n, n1: LONGCARD;
  70.       first: BOOLEAN;
  71.       paths: Paths.PathList;
  72.  
  73.   BEGIN
  74.     Concat (path, entry.name, source, ok);
  75.     IF subdirAttr IN entry.attr THEN
  76.       IF entry.name[0] # '.' THEN
  77.         Append ('\*.*', source, ok);
  78.         DirQuery (source, QueryAll, checkFile, res);
  79.         Close (f1);
  80.         Close (f2);
  81.         IF res < 0 THEN
  82.           error (source, "Can't access subdir");
  83.         END
  84.       END
  85.     ELSE
  86.       paths:= Paths.StdPaths ();
  87.       Paths.SearchFile (entry.name, paths, Paths.fromStart, ok, dest);
  88.       first:= TRUE;
  89.       WHILE ok DO
  90.         Open (f1, source, readOnly);
  91.         IF State (f1) < 0 THEN
  92.           error (source, 'Open error');
  93.           RETURN TRUE
  94.         END;
  95.         first:= FALSE;
  96.         Open (f2, dest, readOnly);
  97.         IF State (f2) < 0 THEN
  98.           error (dest, 'Open error');
  99.           Close (f1);
  100.           RETURN TRUE
  101.         END;
  102.       
  103.         IF FileSize (f1) <> FileSize (f2) THEN
  104.           error (dest, 'Different sizes');
  105.           Close (f1);
  106.           Close (f2);
  107.           RETURN TRUE
  108.         ELSE
  109.           n:= SIZE (buf1);
  110.           LOOP
  111.             ReadBytes (f1, ADR (buf1), n, n1);
  112.             ReadBytes (f2, ADR (buf2), n, n);
  113.             IF n <> n1 THEN
  114.               error (dest, 'Read error');
  115.               Close (f1);
  116.               Close (f2);
  117.               RETURN TRUE
  118.             ELSIF n=0L THEN
  119.               EXIT
  120.             ELSIF ~equal (ADR (buf1), ADR (buf2), n) THEN
  121.               error (dest, 'Not equal');
  122.               Close (f1);
  123.               Close (f2);
  124.               RETURN TRUE
  125.             END
  126.           END;
  127.         END;
  128.         Close (f1);
  129.         Close (f2);
  130.         Paths.SearchFile (entry.name, paths, Paths.fromNext, ok, dest);
  131.       END;
  132.       IF first THEN
  133.         error (source, 'Not found');
  134.       END;
  135.     END;
  136.     RETURN TRUE
  137.   END checkFile;
  138.  
  139. PROCEDURE checkRes (): BOOLEAN;
  140.   VAR ch: CHAR;
  141.   BEGIN
  142.     IF res < 0 THEN
  143.       WriteLn;
  144.       WriteString ('Error #');
  145.       WriteInt (res,0);
  146.       WriteLn;
  147.       Read (ch);
  148.       RETURN TRUE
  149.     END;
  150.     RETURN FALSE
  151.   END checkRes;
  152.  
  153. VAR     n1: String;
  154.         ch: CHAR;
  155.  
  156. BEGIN
  157.   Paths.SetHomePath (ShellMsg.HomePath);
  158.   WriteString ('Compare MM2'); WriteLn;
  159.   WriteLn;
  160.   WriteString ('Compares all files on Disk in A: with same on StdPaths()');
  161.   LOOP
  162.     WriteLn;
  163.     WriteLn;
  164.     WriteString ('Insert next Disk and press <Return> (<Esc> to stop)...');
  165.     REPEAT
  166.       Read (ch);
  167.       IF ch = 33C THEN EXIT END;
  168.     UNTIL ch = 15C;
  169.     WriteLn;
  170.     line:= 1;
  171.     DirQuery ('A:\*.*', QueryAll, checkFile, res);
  172.     Close (f1);
  173.     Close (f2);
  174.     IF checkRes () THEN RETURN END;
  175.   END
  176. END CmpMM2.
  177.